package gim_client

import "net"

const (
	headerSize       = 4 // 数据包头长度
	CommandHeartbeat = 1 // 心跳
	CommandJoin      = 2 // 客户端加入
	CommandQuit      = 3 // 客户端退出
	CommandTransfer  = 4 // 传输消息
	CommandJoinGroup = 5 // 加入群组
)

/*
解码器
*/
func decode(conn net.Conn) (byte, []byte, error) {
	// 读取消息头部字段
	header := make([]byte, headerSize)
	_, err := conn.Read(header)
	if err != nil {
		return 0, nil, err
	}

	// 获取消息长度
	messageSize := int(header[0])<<24 | int(header[1])<<16 | int(header[2])<<8 | int(header[3])

	// 读取消息功能码
	command := make([]byte, 1)
	_, err = conn.Read(command)
	if err != nil {
		return 0, nil, err
	}

	// 读取消息内容
	message := make([]byte, messageSize-1)
	_, err = conn.Read(message)
	if err != nil {
		return 0, nil, err
	}
	return command[0], message, nil
}

/*
编码器
command 消息类型
message 消息正文
*/
func encode(command byte, message []byte) []byte {
	// 构造消息头部字段
	header := make([]byte, headerSize)
	l := len(message) + 1
	header[0] = byte(l >> 24 & 0xFF)
	header[1] = byte(l >> 16 & 0xFF)
	header[2] = byte(l >> 8 & 0xFF)
	header[3] = byte(l & 0xFF)
	header = append(header, command)
	header = append(header, message...)
	return header
}
